home *** CD-ROM | disk | FTP | other *** search
- /* 画面回転処理 テストプログラム 1994年5月14日 */
-
- #include <math.h>
- #include <stdio.h>
-
- #define R 32 /* 赤 */
- #define G 1024 /* 緑 */
- #define B 1 /* 青 */
-
- #define MAX_X 896 /* 仮想VRAMのX方向の大きさ(dot単位) */
- #define MAX_Y 896 /* 仮想VRAMのY方向の大きさ(dot単位) */
-
- #define DSP_X 112 /* 表示画面のX方向の大きさ(dot単位) */
- #define DSP_Y 112 /* 表示画面のY方向の大きさ(dot単位) */
-
- char gwork[1540];
- double RAD=3.141592/180; /* ラジアン */
- int deg; /* 回転角 */
- short kvram[MAX_X][MAX_Y];
- unsigned int W_PAGE; /* レイア1の書き込みページ(0=(0,0) 0x20000=(0,128)) */
- unsigned int VRAM; /* VRAMの先頭アドレス */
-
- short tile[7][256]; /* 背景のキャラクタパターン */
-
- int X=MAX_X/2; /* 仮想VRAMの中心(X座標) */
- int Y=MAX_Y/2; /* 仮想VRAMの中心(Y座標) */
-
- /* 三角関数テーブル */
- int PC[72]; /* 余弦×0x1000×0x1000 (360°を72分割) */
- int MC[72]; /* 余弦×0x1000×(-0x1000) (360°を72分割) */
- int MS[72]; /* 正弦×0x1000×(-0x1000) (360°を72分割) */
-
- /* roll2用オフセットテーブル */
- int XPC[72][DSP_X],YMS[72][DSP_Y],XMS[72][DSP_X],YMC[72][DSP_Y];
-
- /* roll3用オフセットテーブル */
- int XOF[72][DSP_X],YOF[72][DSP_Y];
-
- int MAP[56][56]; /* マップ */
-
- int tx,ty; /* 表示画面の回転中心に対応する仮想VRAMの座標 */
-
-
-
- main()
-
- {
- int i,j;
-
- init_tri(); /* 三角関数テーブルの作成 */
- init_tri2(); /* roll2用オフセットテーブルの作成 */
- init_tri3(); /* roll3用オフセットテーブルの作成 */
-
- EGB_init( gwork, 1536 ) ; /* BIOSの初期化 */
- EGB_resolution( gwork, 0, 10 ) ; /* ページ0の解像度設定(モード10) */
- EGB_resolution( gwork, 1, 10 ) ; /* ページ1の解像度設定(モード10) */
- EGB_displayPage( gwork, 1, 3 ) ; /* 表示ページの設定(両ページ) */
-
- EGB_writePage( gwork, 1 ) ; /* 書き込みページを1に */
- EGB_displayStart( gwork, 2, 4, 4 ) ; /* 表示範囲の倍率設定(4X4) */
- EGB_displayStart( gwork, 3, 128,240 ) ; /* 表示範囲の設定 */
- EGB_displayStart( gwork, 0, 0, 0 ) ; /* 表示開始位置 */
- EGB_displayStart( gwork, 1, 0, 0 ) ; /* 仮想画面中の位置 */
-
- EGB_writePage( gwork, 0 ) ; /* 書き込みページを0に */
- EGB_displayStart( gwork, 2, 2, 2 ) ; /* 表示範囲の倍率設定(2X2) */
- EGB_displayStart( gwork, 3, 320,240 ) ; /* 表示範囲の設定 */
- EGB_displayStart( gwork, 0, 0, 0 ) ; /* 表示開始位置 */
- EGB_displayStart( gwork, 1, 0, 0 ) ; /* 仮想画面中の位置 */
-
- EGB_fontStyle(gwork,1); /* 太文字 */
- EGB_textZoom(gwork,0,8,16); /* ANKの拡大率 */
- EGB_textZoom(gwork,1,16,16); /* 漢字の拡大率 */
- EGB_color(gwork,0,0x7fff); /* 文字色→白 */
-
- for (i=0;i<256;i++)
- {
- tile[0][i]=B*31;
- tile[1][i]=R*31;
- tile[2][i]=(R+B)*31;
- tile[3][i]=G*31;
- tile[4][i]=(G+B)*31;
- tile[5][i]=(G+R)*31;
- tile[6][i]=(G+R+B)*31;
- };
-
- /* マップの作成 */
- for (j=0;j<56;j++) {for (i=0;i<56;i++) MAP[j][i]=rnd(6);};
-
-
- /* 仮想VRAMの初期画面作成 */
- for (j=0;j<56;j++)
- {
- for (i=0;i<56;i++) prtchr(kvram,i*16,j*16,tile[MAP[j][i]]);
- };
-
- /* roolのテスト */
- init();
- EGB_putSjis(gwork,240,20,"roll");
- EGB_putSjis(gwork,240,52+16*1,"表示画面");
- EGB_putSjis(gwork,240,52+16*2,"1点毎に");
- EGB_putSjis(gwork,240,52+16*3,"対応する");
- EGB_putSjis(gwork,240,52+16*4,"仮想");
- EGB_putSjis(gwork,240,52+16*5,"VRAM");
- EGB_putSjis(gwork,240,52+16*6,"アドレス");
- EGB_putSjis(gwork,240,52+16*7,"を計算し");
- EGB_putSjis(gwork,240,52+16*8,"ている。");
- EGB_putSjis(gwork,240,240-16,"SELECTボタン");
- EGB_putSjis(gwork,240,240,"Next Test");
- while(1)
- {
- move(); /* 仮想VRAM中の表示位置の移動 */
- roll(PC[deg],MC[deg],MS[deg],VRAM+W_PAGE,kvram[0],tx>>12,ty>>12,0,0,0,0);
- page(W_PAGE>>10); W_PAGE=W_PAGE^0x20000; /* 改ページ */
- if ((INPB(0x04d0) & 0x03)==0) break; /* SELECTボタン押下 -> 強制終了 */
- };
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
-
- /* roll2のテスト */
- init();
- EGB_putSjis(gwork,240,20,"roll2");
- EGB_putSjis(gwork,240,28+16*1,"-56<X<56");
- EGB_putSjis(gwork,240,28+16*2,"-56<Y<56");
- EGB_putSjis(gwork,240,28+16*3,"の範囲で");
- EGB_putSjis(gwork,240,28+16*4," X×Cosθ,");
- EGB_putSjis(gwork,240,28+16*5,"-Y×Sinθ,");
- EGB_putSjis(gwork,240,28+16*6,"-X×Sinθ,");
- EGB_putSjis(gwork,240,28+16*7,"-Y×Cosθ");
- EGB_putSjis(gwork,240,28+16*8,"をテーブル化");
- EGB_putSjis(gwork,240,28+16*9,"これで");
- EGB_putSjis(gwork,240,28+16*10,"仮想VRAM");
- EGB_putSjis(gwork,240,28+16*11,"アドレス算出");
- EGB_putSjis(gwork,240,240-16,"SELECTボタン");
- EGB_putSjis(gwork,240,240,"Next Test");
- while(1)
- {
- move(); /* 仮想VRAM中の表示位置の移動 */
- roll2(&(XPC[deg][0]),&(YMS[deg][0]),&(XMS[deg][0]),&(YMC[deg][0]),VRAM+W_PAGE,kvram[0],tx>>12,ty>>12);
- page(W_PAGE>>10); W_PAGE=W_PAGE^0x20000; /* 改ページ */
- if ((INPB(0x04d0) & 0x03)==0) break; /* SELECTボタン押下 -> 強制終了 */
- };
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
-
- /* roll3のテスト */
- init();
- EGB_putSjis(gwork,240,20,"roll3");
- EGB_putSjis(gwork,240,28+16*1,"-56<X<56");
- EGB_putSjis(gwork,240,28+16*2,"-56<Y<56");
- EGB_putSjis(gwork,240,28+16*3,"の範囲で");
- EGB_putSjis(gwork,224,28+16*4," X(Cosθ-Sin");
- EGB_putSjis(gwork,224,28+16*5," θ×MAX_X),");
- EGB_putSjis(gwork,224,28+16*6,"-Y(Sinθ+Cos");
- EGB_putSjis(gwork,224,28+16*7," θ×MAX_X)");
- EGB_putSjis(gwork,240,28+16*8,"をテーブル化");
- EGB_putSjis(gwork,240,28+16*9,"これで");
- EGB_putSjis(gwork,240,28+16*10,"仮想VRAM");
- EGB_putSjis(gwork,240,28+16*11,"アドレス算出");
- EGB_putSjis(gwork,240,240-16,"SELECTボタン");
- EGB_putSjis(gwork,240,240,"Test End");
- while(1)
- {
- move(); /* 仮想VRAM中の表示位置の移動 */
- roll3(XOF[deg],YOF[deg],VRAM+W_PAGE,kvram[0],tx>>12,ty>>12);
- page(W_PAGE>>10); W_PAGE=W_PAGE^0x20000; /* 改ページ */
- if ((INPB(0x04d0) & 0x03)==0) break; /* SELECTボタン押下 -> 強制終了 */
- };
- while ((INPB(0x04d0) & 0x3f)!=0x3f); /* パッドを放すまで待つ */
-
- screenterm(gwork); /* MS-DOSの画面モードに設定する。*/
-
- };
-
-
- init()
- /* テスト毎の初期化処理 */
- {
- W_PAGE=0; /* レイア1の書き込みページ(0=(0,0) 0x20000=(0,128)) */
- VRAM=g_loc(0,4)+0x40000; /* VRAMの先頭アドレス */
- deg=54; /* 回転角 */
- tx=MAX_X/2*0x1000; ty=MAX_Y/2*0x1000; /* マイタンクの座標(中心) */
- g_cls();
- };
-
-
- /* sqr(56^2+80^2)=97≒98 */
- #define LIM_MIN 98 /* X & Y の最小値 */
- #define LIM_MAX 797 /* X & Y の最大値(895-98) */
-
- move()
- /* 仮想VRAM中の表示位置の移動 */
- {
- int p,wtx,wty;
- int pc,mc,ms;
-
- p=INPB(0x04d0);
-
- /*
- X=xcos-ysin Y=-xsin-ycos
- 0=xcos-ysin 1=-xsin-ycos -> y=-(Y+xsin)/cos x=(X+ysin)/cos -> x=sin y=cos
- 0=xcos-ysin -1=-xsin-ycos -> y=(Y+xsin)/cos x=(X+ysin)/cos -> x=-sin y=-cos
- */
-
- pc=PC[deg]*4; mc=MC[deg]*4; ms=MS[deg]*4;
- wtx=tx; wty=ty;
- if ((p & 0x01)==0) {ty=ty+pc; tx=tx-ms;}; /* パッド上 */
- if ((p & 0x02)==0) {ty=ty+mc; tx=tx+ms;}; /* パッド下 */
-
- if ((p & 0x04)==0) /* パッド左 */
- { /* Bボタン */
- if ((p & 0x20)==0) {tx=tx-pc; ty=ty-ms;} /* ONなら平行移動 */
- else {deg--; if (deg<0) deg=71;}; /* OFFなら回転 */
- };
- if ((p & 0x08)==0) /* パッド右 */
- { /* Bボタン */
- if ((p & 0x20)==0) {tx=tx-mc; ty=ty+ms;} /* ONなら平行移動 */
- else {deg++; if (deg>71) deg=0;}; /* OFFなら回転 */
- };
-
- /* 画面外かチェック */
- if ( ((tx>>12)<LIM_MIN) || ((tx>>12)>LIM_MAX) ) tx=wtx;
- if ( ((ty>>12)<LIM_MIN) || ((ty>>12)>LIM_MAX) ) ty=wty;
-
- };
-
-
-
- page(hed)
- /* レイア1のハードスクロール */
- int hed; /* レイア1の画面表示開始位置 */
- {
- asm(" pushl %edx");
- asm(" movl 12(%esp),%eax"); /* hed */
- asm(" andl $0xff,%eax");
- asm(" roll $8,%eax");
- asm(" pushl %eax"); /* FA1 */
- asm(" movw $0x440,%dx");
- asm(" movb $21,%al");
- asm(" outb %al,%dx");
- asm(" popl %eax"); /* FA1 */
- asm(" movw $0x442,%dx");
- asm(" outw %ax,%dx");
- asm(" popl %edx");
-
- };
-
-
- init_tri()
- /* 三角関数テーブルの作成 */
- {
- int i,j;
- double c,s,r; /* 回転角 */
-
- for (i=0;i<72;i++)
- {
- r=(360/72*i)*RAD; c=cos(r)*0x1000; s=sin(r)*0x1000; /* ラジアンへの変換 */
- PC[i]=c; MC[i]=-c; MS[i]=-s;
- };
-
- };
-
-
- roll(pc,mc,ms,vram,kvram,kx,ky,w0,w1,w2,w3)
- /* 44 48 52 56 60 64 68 72 76 80 84 */
- /* 画面回転 1994年1月30日-2月8日 */
- int pc; /* cos×0x1000 */
- int mc; /* -cos×0x1000 */
- int ms; /* -sin×0x1000 */
- int vram; /* VRAM左上アドレス */
- short *kvram; /* 仮想VRAM先頭アドレス -> 中心アドレス */
- int kx,ky; /* 仮想VRAM回転中心座標 -> X方向オフセット1,2*/
- int w0,w1; /* ワークエリア Y方向オフセット1,2 */
- int w2,w3; /* ワークエリア ループカウンタ */
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl $0x0104");
- asm(" popl %es");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 64(%esp),%ecx"); /* 中心 X座標 */
- asm(" addl %ecx,%ecx");
- asm(" movl 68(%esp),%eax"); /* 中心 Y座標 */
- asm(" movl $1792,%ebx"); /* 仮想VRAM 1行の容量(MAX_X×2) */
- asm(" mull %ebx");
- asm(" addl %ecx,%eax"); /* 仮想VRAM 中心座標のオフセット */
- asm(" addl %eax,60(%esp)"); /* +仮想VRAM先頭アドレス */
-
- asm(" movl $-56,%ebx"); /* 表示座標左上の点(-DSP_X/2) */
- asm(" movl 52(%esp),%eax"); /* -sin */
- asm(" imull %ebx");
- asm(" movl %eax,68(%esp)"); /* X方向オフセット2 初期値 */
- asm(" movl %eax,72(%esp)"); /* Y方向オフセット1 初期値 */
- asm(" movl 44(%esp),%eax"); /* cos */
- asm(" imull %ebx");
- asm(" movl %eax,64(%esp)"); /* X方向オフセット1 初期値 */
- asm(" movl 48(%esp),%eax"); /* -cos */
- asm(" imull %ebx");
- asm(" movl %eax,76(%esp)"); /* Y方向オフセット2 初期値 */
-
- asm(" movl $896,%ebx"); /* MAX_X */
- asm(" movl $112,84(%esp)"); /* Y方向ループカウンタ(DSP_Y) */
- asm("lpY: movl $112,80(%esp)"); /* X方向ループカウンタ(DSP_X) */
- asm(" movl 76(%esp),%eax"); /* Y方向オフセット2 */
- asm(" sarl $12,%eax");
- asm(" imull %ebx"); /* (Y方向オフセット2/0x1000)×MAX_X */
- asm(" movl 72(%esp),%ebp"); /* Y方向オフセット1 */
- asm(" sarl $12,%ebp"); /* (Y方向オフセット1)/0x1000 */
- asm(" addl %eax,%ebp"); /* Y方向オフセット */
- asm(" addl %ebp,%ebp"); /* ×2 */
- asm(" addl 60(%esp),%ebp"); /* +仮想VRAM中心アドレス(基準点) */
- asm(" movl 56(%esp),%edi"); /* 初期VRAMアドレス */
- asm(" movl 64(%esp),%esi"); /* X方向オフセット1 */
- asm(" movl 68(%esp),%ecx"); /* X方向オフセット2 */
-
- asm("lpX: movl %ecx,%eax"); /* X方向オフセット2 */
- asm(" sarl $12,%eax");
- asm(" imull %ebx"); /* (X方向オフセット2/0x1000)×MAX_X) */
- asm(" movl %esi,%edx"); /* X方向オフセット1 */
- asm(" sarl $12,%edx"); /* (X方向オフセット1)/0x1000 */
- asm(" addl %edx,%eax"); /* X方向オフセット */
- asm(" movw %ss:(%ebp,%eax,2),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" addl 44(%esp),%esi"); /* X方向オフセット1+cos */
- asm(" addl 52(%esp),%ecx"); /* X方向オフセット2+(-sin) */
- asm(" decl 80(%esp)"); /* X方向ループカウンタ-1 */
- asm(" jnz lpX");
-
- asm(" addl $0x400,56(%esp)"); /* VRAM+0x400 */
- asm(" movl 52(%esp),%eax");
- asm(" addl %eax,72(%esp)"); /* Y方向オフセット1+(-sin) */
- asm(" movl 48(%esp),%eax");
- asm(" addl %eax,76(%esp)"); /* Y方向オフセット2+(-cos) */
- asm(" decl 84(%esp)"); /* Y方向ループカウンタ-1 */
- asm(" jnz lpY");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
- init_tri2()
- /* roll2用オフセットテーブルの作成 */
- {
- /* X=xcos-ysin Y=-xsin-ycos */
- int i,j,k;
-
- for (i=0;i<72;i++)
- {
- for (j=0;j<DSP_X;j++)
- {
- k=j-(DSP_X/2);
- XPC[i][j]=((PC[i]*k)>>12)*2; YMS[i][j]=((MS[i]*k)>>12)*MAX_X*2;
- XMS[i][j]=((MS[i]*k)>>12)*2; YMC[i][j]=((MC[i]*k)>>12)*MAX_X*2;
- };
- };
-
- };
-
-
- /* X=xcos-ysin Y=-xsin-ycos*/
- roll2(xpc,yms,xms,ymc,vram,kvram,kx,ky)
- /* 44 48 52 56 60 64 68 72 */
- /* 画面回転(高速版1) 1994年3月28日-3月29日 */
- int *xpc; /* cos×x(-56:56)×2 */
- int *yms; /* -sin×y(-56:56)×MAX_X×2 */
- int *xms; /* -sin×x(-56:56)×2 */
- int *ymc; /* -cos×y(-56:56)×MAX_X×2 */
- int vram; /* VRAM左上アドレス */
- short *kvram; /* 仮想VRAM先頭アドレス -> 中心アドレス */
- int kx,ky; /* 仮想VRAM回転中心座標 -> X方向オフセット1,2*/
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl $0x0104");
- asm(" popl %es");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 68(%esp),%ecx"); /* 中心 X座標 */
- asm(" addl %ecx,%ecx");
- asm(" movl 72(%esp),%eax"); /* 中心 Y座標 */
- asm(" movl $1792,%ebx"); /* 仮想VRAM 1行の容量(MAX_X×2) */
- asm(" mull %ebx");
- asm(" addl %ecx,%eax"); /* 仮想VRAM 中心座標のオフセット */
- asm(" addl %eax,64(%esp)"); /* +仮想VRAM先頭アドレス=>中心アドレス */
-
- asm(" movl $0,72(%esp)"); /* Y方向オフセット(0:DSP_Y) */
- asm("lpY2: movl 64(%esp),%edx"); /* 仮想VRAM中心アドレス */
- asm(" movl 72(%esp),%ebx"); /* Y方向オフセット */
- asm(" movl 52(%esp),%eax"); /* XMS先頭アドレス */
- asm(" addl %ss:(%eax,%ebx,4),%edx"); /* kvram(中心)+xms */
- asm(" movl 56(%esp),%eax"); /* YMC先頭アドレス */
- asm(" addl %ss:(%eax,%ebx,4),%edx"); /* kvram(中心)+xms+ymc */
- asm(" movl 60(%esp),%edi"); /* VRAM先頭アドレス */
- asm(" xorl %ebx,%ebx"); /* X方向オフセット */
-
- asm("lpX2: movl 44(%esp),%eax"); /* XPC先頭アドレス */
- asm(" movl %ss:(%eax,%ebx,4),%esi"); /* xpc */
- asm(" movl 48(%esp),%eax"); /* YMS先頭アドレス */
- asm(" addl %ss:(%eax,%ebx,4),%esi"); /* xpc+yms */
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" incl %ebx"); /* X方向オフセット+1 */
- asm(" cmpl $112,%ebx"); /* DSP_X */
- asm(" jnz lpX2");
-
- asm(" addl $0x0400,60(%esp)"); /* VRAMアドレス+0x400 */
- asm(" incl 72(%esp)"); /* Y方向オフセット+1 */
- asm(" cmpl $112,72(%esp)"); /* DSP_Y */
- asm(" jnz lpY2");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
- init_tri3()
- /* roll3用オフセットテーブルの作成 */
- {
- /* X=xcos-ysin Y=-xsin-ycos */
- int i,j,k;
-
- for (i=0;i<72;i++)
- {
- for (j=0;j<DSP_X;j++)
- {
- k=j-(DSP_X/2);
- XOF[i][j]=(((PC[i]*k)>>12)+((MS[i]*k)>>12)*MAX_X)*2;
- YOF[i][j]=(((MS[i]*k)>>12)+((MC[i]*k)>>12)*MAX_X)*2;
- };
- };
-
- };
-
-
- roll3(xof,yof,vram,kvram,kx,ky)
- /* 44 48 52 56 60 64 */
- /* 画面回転(高速版2) 1994年3月29日 */
- /* X=xcos-ysin Y=-xsin-ycos*/
- int *xof; /* (cos×x(-56:56)-sin×y(-56:56)×MAX_X)×2 */
- int *yof; /* (-sin×x(-56:56)-cos×y(-56:56)×MAX_X)×2 */
- int vram; /* VRAM左上アドレス */
- short *kvram; /* 仮想VRAM先頭アドレス -> 中心アドレス */
- int kx,ky; /* 仮想VRAM回転中心座標 -> X方向オフセット1,2*/
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl $0x0104");
- asm(" popl %es");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 64(%esp),%eax"); /* 中心 Y座標 */
- asm(" movl $896,%ebx"); /* MAX_X */
- asm(" mull %ebx");
- asm(" addl 60(%esp),%eax"); /* 中心 X座標+中心 Y座標×MAX_X */
- asm(" addl %eax,%eax"); /* ×2(仮想VRAM 中心座標のオフセット) */
- asm(" addl %eax,56(%esp)"); /* +仮想VRAM先頭アドレス=>中心アドレス */
-
- asm(" movl 44(%esp),%ebp"); /* XOF先頭アドレス */
- asm(" xorl %ecx,%ecx"); /* Y方向オフセット(0:DSP_Y) */
- asm("lpY3: movl 56(%esp),%edx"); /* 仮想VRAM中心アドレス */
- asm(" movl 48(%esp),%eax"); /* YOF先頭アドレス */
- asm(" addl %ss:(%eax,%ecx,4),%edx"); /* kvram(中心)+YOF */
- asm(" movl 52(%esp),%edi"); /* VRAM先頭アドレス */
- asm(" xorl %ebx,%ebx"); /* X方向オフセット */
-
- asm("lpX3: movl (%ebp,%ebx,4),%esi"); /* XOF */
- asm(" movw %ss:(%edx,%esi),%ax"); /* 仮想VRAM回転変換位置の色情報 */
- asm(" stosw"); /* 描画対象VRAMに転送しVRAM+2 */
- asm(" incl %ebx"); /* X方向オフセット+1 */
- asm(" cmpl $112,%ebx"); /* DSP_X */
- asm(" jnz lpX3");
-
- asm(" addl $0x0400,52(%esp)"); /* VRAMアドレス+0x400 */
- asm(" incl %ecx"); /* Y方向オフセット+1 */
- asm(" cmpl $112,%ecx"); /* DSP_Y */
- asm(" jnz lpY3");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };
-
-
-
-
- prtchr(kvram,x,y,chr)
- /* パターン転送 1994年2月9日 */
- short *kvram; /* 仮想VRAM先頭アドレス */
- int x,y; /* 転送座標左上 */
- short *chr; /* キャラクタ先頭アドレス */
- {
- asm(" pushal");
-
- asm(" pushl %es");
- asm(" pushl %ss");
- asm(" popl %es");
- asm(" pushl %ss");
- asm(" popl %ds");
-
- asm(" cld"); /* ストリング方向フラグ=0 */
- asm(" movl 52(%esp),%eax"); /* 転送先 Y座標 */
- asm(" movl $896,%ebx");
- asm(" mull %ebx"); /* ×MAX_X */
- asm(" addl 48(%esp),%eax"); /* 転送先 X座標 */
- asm(" addl %eax,%eax"); /* ×2 */
- asm(" addl 44(%esp),%eax"); /* 仮想VRAM描画開始アドレス */
- asm(" movl %eax,%edi");
-
- asm(" movl 56(%esp),%esi"); /* キャラクタ先頭アドレス */
- asm(" movl $16,%ebx"); /* Y方向ループカウンタ */
- asm("LY: movl $16,%ecx"); /* X方向ループカウンタ */
- asm("LX: lodsw"); /* キャラクタ -> ax & キャラクタアドレス+2 */
- asm(" orw %ax,%ax");
- asm(" jz skip"); /* キャラクタがNULL dotなら転送しない */
- asm(" stosw"); /* ax -> 仮想VRAM & 仮想VRAM描画アドレス+2 */
- asm(" loop LX");
- asm(" addl $1760,%edi"); /* 仮想VRAM描画アドレス+(MAX_X-16)×2 */
- asm(" decl %ebx");
- asm(" jnz LY");
-
- asm(" popl %es");
-
- asm(" popal");
-
- asm(" leave");
- asm(" ret");
-
- asm("skip: addl $2,%edi"); /* 仮想VRAM描画アドレス+2 */
- asm(" loop LX");
- asm(" addl $1760,%edi"); /* 仮想VRAM描画アドレス+(MAX_X-16)×2 */
- asm(" decl %ebx");
- asm(" jnz LY");
-
- asm(" popl %es");
-
- asm(" popal");
-
- };